package edu.hebeu.fragment;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Looper;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import androidx.annotation.IdRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

import com.google.gson.Gson;

import java.util.Set;

import edu.hebeu.util.sqlite.Dao;

import static android.content.Context.MODE_PRIVATE;

public abstract class BaseFragment extends Fragment {

    protected Context context;
    private static Gson GSON = new Gson();
    private View contentView;
    private static Dao DAO;

    /**
     * 创建该Fragment时初始化的View的方法
     */
    protected abstract void initViews();

    /**
     * 获取当前Fragment对应的布局资源ID
     * @return
     */
    protected abstract int getLayoutId();

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        context = getActivity(); // 获取上下文对象
        contentView = inflater.inflate(getLayoutId(), container, false);
        initViews();

        DAO = new Dao(context);
        return contentView;
    }

    /**
     * 这个方法用来获取该Fragment对应的布局资源文件对应的ID
     * @param id
     * @param <T>
     * @return
     */
    protected <T extends View> T findViewByIdF(@IdRes int id) {
        return contentView.findViewById(id); // Fragment中不能直接使用findViewById()方法，而是要借助view对象实例去使用findViewById()方法
    }

    /**
     * 显示吐司弹窗的方法
     * @param msg 消息内容
     * @param time 显示时长，0以下---LENGTH_SHORT；1以上---LENGTH_LONG；
     * @param isSync 是否需要同步处理(在子线程中修改主线程，如其他线程修改UI线程内的控件时，可以将此标志打开，不需要再进行特殊的处理)
     */
    protected void showToast(String msg, int time, boolean isSync) {
        if (isSync) {
            if (time <= 0) {
                Looper.prepare();
                Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
                Looper.loop();
            } else {
                Looper.prepare();
                Toast.makeText(context, msg, Toast.LENGTH_LONG).show();
                Looper.loop();
            }
        } else {
            if (time <= 0) {
                Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(context, msg, Toast.LENGTH_LONG).show();
            }
        }
    }

    /**
     * 跳转Activity的方法
     * @param cClass 要跳转的Activity的字节码对象
     * @param isDestroy 决定是否销毁该Activity
     */
    protected void jumpActivity(Class cClass, boolean isDestroy) {
        Intent intent = new Intent(context, cClass);
        startActivity(intent);
        if (isDestroy) {
            getActivity().finish();
        }
    }

    /**
     * 这个方法用来对Java对象进行反序列化
     * @param obj
     * @return
     */
    protected String serialize(Object obj) {
        return GSON.toJson(obj);
    }

    /**
     * 这个方法用来对JSON串进行反序列化
     * @param jsonStr
     * @param cClass
     * @return
     */
    protected Object deSerialize(String jsonStr, Class cClass) {
        try {
            return GSON.fromJson(jsonStr, cClass);
        } catch (Exception e) {
            return null; // 对应需要token进行身份验证的接口，如果没有传入token，后台将会直接响应错误页面，隐藏GSON是无法解析的(会直接抛出异常，
            // 这里将错误捕获，变成null，交给调用该方法的位置去进行相关的处理)
        }
    }

    /**
     * 这个方法用来将key-value信息持久化到SP的xml文件中
     * @param key
     * @param value
     */
    protected void saveSPFile(String key, Object value) {
        //第一个参数为存储的文件名，第二个参数为默认的操作模式
        SharedPreferences sharedPreferences = getActivity().getSharedPreferences("sp_info", MODE_PRIVATE); // 创建类型为私有的，名字为sp_info.xml的SP文件
        SharedPreferences.Editor editor = sharedPreferences.edit(); // 创建可编辑的对象

        if (value instanceof Integer) {
            editor.putInt(key, (Integer) value);
        } else if (value instanceof  Long) {
            editor.putLong(key, (Long) value);
        } else if (value instanceof Float) {
            editor.putFloat(key, (Float) value);
        } else if (value instanceof Boolean) {
            editor.putBoolean(key, (Boolean) value);
        } else if (value instanceof String) {
            editor.putString(key, (String) value); // 将要添加的KEY-VALUE对进行编辑
        } else if (value instanceof Set) {
            editor.putStringSet(key, (Set<String>) value);
        }
        editor.apply(); // 提交
    }

    /**
     * 这个方法用来删除SP文件内的结点
     * @param key
     */
    protected void deleteSPFile(String key) {
        //第一个参数为存储的文件名，第二个参数为默认的操作模式
        SharedPreferences sharedPreferences = getActivity().getSharedPreferences("sp_info", MODE_PRIVATE); // 创建类型为私有的，名字为sp_info.xml的SP文件
        SharedPreferences.Editor editor = sharedPreferences.edit(); // 创建可编辑的对象

        editor.remove(key);
        editor.apply(); // 提交
    }

    /**
     * 这个方法用来读取SP文件
     * @param key 要查找的键的名称
     * @param defaultValue 找不到值的时候的默认值
     * @return
     */
    protected Object getSPFile(String key, Object defaultValue) {
        //第一个参数为存储的文件名，第二个参数为默认的操作模式
        SharedPreferences spf = getActivity().getSharedPreferences("sp_info", MODE_PRIVATE);

        Object res = null;
        if (defaultValue instanceof Integer) {
            res = spf.getInt(key, (Integer) defaultValue);
        } else if (defaultValue instanceof  Long) {
            res = spf.getLong(key, (Long) defaultValue);
        }  else if (defaultValue instanceof Float) {
            res = spf.getFloat(key, (Float) defaultValue);
        } else if (defaultValue instanceof Boolean) {
            res = spf.getBoolean(key, (Boolean) defaultValue);
        } else if (defaultValue instanceof String) {
            res = spf.getString(key, (String) defaultValue);
        } else if (defaultValue instanceof Set) {
            res = spf.getStringSet(key, (Set<String>) defaultValue);
        }
        return res;
    }

    protected static Dao getDAO() {
        return DAO;
    }

}
